import router from '@ohos.router'
import { UserModel } from '../../models/UserModel'

export const USER_KEY = 'interview-user'

/**
 * 权限控制工具类
 */
export class Auth {

  // 数据的键
  private static KEY = USER_KEY
  // 页面白名单列表  private 表示私有的，仅在类内部能访问到
  private static WHITE_LIST = ['pages/LoginPage']

  // 初始化持久用户信息，默认为空对象
  static initLocalUser() {
    // 由于要持久化，所以用 PersistentStorage
    // Tips1: PersistentStorage持久化，在预览器中不生效
    // Tips2：第二个参数是默认值，如果之前该KEY已经有值了，默认值就不会生效
    PersistentStorage.PersistProp(this.KEY, '{}')

    PersistentStorage.PersistProp('heheda', '呵呵哒')

  }

  // 设置用户信息
  static setUser(user: UserModel) {
    // user.toString() 方法是 UserModel 的实例方法，也就是说，需要 实例 才能调用
    // 所谓实例，就是使用 new 关键字创建出来的对象 const user = new UserModel()  这个 user 就是 UserModel 的实例对象
    // 才能调用 user.toString()，
    // 如果在调用 Auth.setUser() 时，传的不是实例，而是符合 UserModel 类型的 普通对象，比如 const user =  { id, username, ... }
    // 那么 user 就调用不到 toString() 这个实例方法了
    // 总结：如果是 数据模型 类，最好不要在该类中 定义 业务方法，仅当作类型使用即可
    return AppStorage.SetOrCreate(this.KEY, JSON.stringify(user))
  }

  // 获取用户信息
  static getUser() {
    return JSON.parse(AppStorage.Get(this.KEY) || '{}') as UserModel
  }

  // 删除用户信息
  static delUser() {
    // 删除并不是真正的删除，只不过将其数据覆盖为空对象了
    return AppStorage.SetOrCreate(this.KEY, '{}')
  }

  // 跳转路由（内置权限控制）
  static pushUrl(options: router.RouterOptions) {
    const user = this.getUser()
    // 如果访问的页面地址 不在 白名单内 并且 又没有登录 那就需要跳转到登录页
    if (!this.WHITE_LIST.includes(options.url) && !user.token) {
      return router.pushUrl({
        url: 'pages/LoginPage',
        params: {
          ...options.params,
          return_url: options.url // 将原本想要跳转的页面地址 作为 登录后的 回跳地址
        }
      })
    }
    return router.pushUrl(options)
  }
}